科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件使用.NET多线程技术显示实时股票信息

使用.NET多线程技术显示实时股票信息

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文的内容是学习如何使用多线程技术建立应用程序,使应用程序在执行时间和资源密集型后台事务的时候,用户界面(UI)仍然保持活动状态。

作者:陶刚编译 来源:天极开发 2007年11月3日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
激活图形

  下一步,导入下面的名字空间(在代码窗口的顶部):

Imports SoftwareFX.ChartFX
Imports System.Threading

  定义用于线程的全局变量t1:

Dim t1 As Thread

  在Chart1_Load事件中,初始化Chart组件:

Private Sub Chart1_Load(ByVal sender As _
System.Object, ByVal e As System.EventArgs) Handles Chart1.Load
 'x轴上每隔5点显示时间
 Chart1.AxisX.Step = 5
 '每个点之间用5象素间隔
 Chart1.AxisX.PixPerUnit = 5
 '使图表可以滚动
 Chart1.Scrollable = True
 '打开和关闭通讯管道
 Chart1.OpenData(COD.Values, 1, COD.Unknown)
 Chart1.CloseData(COD.Values)
End Sub

  给当前的窗体添加一个叫做StockQuote的类。StockQuote类调用前面的Web服务并用返回的股票价格来更新图表。

Public Class StockQuote
 '组件中图形的数量
 Const NUM_SERIES = 1

 Private lastPoint As Integer = 0
 Dim stockPrice As Single

 Private pStockSymbol As String
 Private pStockSeries As Integer = 0
 Private pChartControl As Chart

 WriteOnly Property StockSymbol()
  Set(ByVal Value)
   pStockSymbol = Value
  End Set
 End Property

 WriteOnly Property ChartControl()
  Set(ByVal Value)
   pChartControl = Value
  End Set
 End Property

 Public Sub InvokeWebService()
  Dim ws As New StockWS.Service1

  For i As Integer = 0 To 10000
   stockPrice = ws.getPrice(pStockSymbol)
   pChartControl.Invoke(New _
myDelegate(AddressOf updateChart), New Object() {})
   '继续之前等待1秒钟
   Thread.Sleep(1000)
  Next
 End Sub

 Public Delegate Sub myDelegate()
  Public Sub updateChart()
  pChartControl.OpenData(COD.Values, NUM_SERIES, COD.Unknown)
  pChartControl.Value(pStockSeries, lastPoint) = stockPrice
  '显示x轴上的时间
  pChartControl.AxisX.Label(lastPoint) = DateTime.Now.ToShortTimeString
  lastPoint += 1
  pChartControl.CloseData(COD.Values)
  '把滚动条移到最右边
  pChartControl.AxisX.ScrollPosition = pChartControl.AxisX.ScrollSize
 End Sub

End Class

  你通过StockSymbol属性把需要的股票编码传递给StockQuote类,并使用ChartControl属性设置图表更新。InvokeWebService()方法在循环(示例中设置为10,000)中周期性地调用上面的Web服务。由于这个类会在一个单独的线程中执行,你必须非常小心以确保自己不会自动地更新某个Windows控件,因为Windows控件并不是线程安全的(thread-safe)。作为代替,你必须使用委托并调用自己希望更新的控件上的Invoke()方法。代码每秒钟调用Web服务一次,这是由Thread.Sleep(1000)语句设置的。

  为了启动线程用最新的股票信息更新图表,给"获取股票报价"按钮的点击(Click)事件增加下面的代码:

Private Sub btnGetStockQuote1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles btnGetStockQuote1.Click
 Dim sq As New StockQuote
 sq.StockSymbol = cmbStocks1.SelectedItem
 sq.ChartControl = Chart1
 t1 = New Thread(AddressOf sq.InvokeWebService)
 t1.Start()
End Sub

  把调用该Web服务的代码打包为一个类的主要原因是Thread类构造函数只能接受一个ThreadStart委托(启动线程的方法的委托),不存在可以接受多个参数值的重载的Thread.Start()方法。因此,把多个参数传递到一个线程中的唯一途径是把调用的相关代码打包为一个类,接着你就可以通过这个类的参数来传递参数。

  按F5测试这段代码,选择一只股票并点击"获取股票报价"按钮。你现在可以移动窗口了(即UI并没有被重复的Web服务调用锁死),并且同时可以看到图表一直在用最新的股票信息更新(图5所示)。

点击放大此图片
图5:测试该应用程序-当你选择某只股票编码并点击"获取股票报价"按钮的时候,重复调用Web服务的结果显示在图表中;但是由于该Web服务运行在后台线程上,调用它不会影响正常的UI操作。
    • 评论
    • 分享微博
    • 分享邮件
    闂傚倸鍊风欢锟犲矗鎼淬劌绐楅柡鍥╁亹閺嬪酣鏌曡箛瀣仾濠殿垰銈搁弻鏇$疀鐎n亖鍋撻弽顓ㄧ稏闁跨噦鎷�

    婵犵數濮烽。浠嬪焵椤掆偓閸熷潡鍩€椤掆偓缂嶅﹪骞冨Ο璇茬窞闁归偊鍓涢悾娲⒑闂堟单鍫ュ疾濠婂嫭鍙忔繝濠傜墛閸嬨劍銇勯弽銊с€掗柟钘夊暣閺岀喖鎮滈埡鍌涚彋閻庤娲樺畝绋跨暦閸洖鐓涢柛灞剧矋濞堟悂姊绘担绛嬪殐闁搞劋鍗冲畷銏ゅ冀椤愩儱小闂佹寧绋戠€氼參宕伴崱妯镐簻闁靛牆鎳庢慨顒€鈹戦埥鍡椾簼婵犮垺锚铻炴俊銈呮噺閸嬪倹绻涢崱妯诲碍閻庢艾顦甸弻宥堫檨闁告挾鍠庨锝夘敆娓氬﹦鐭楁繛鎾村焹閸嬫捇鏌e☉娆愬磳闁哄本绋戦埞鎴﹀川椤曞懏鈻婄紓鍌欑劍椤ㄥ懘鎯岄崒鐐靛祦閹兼番鍔岄悞鍨亜閹烘垵顏╅悗姘槹閵囧嫰寮介妸褎鍣ョ紓浣筋嚙濡繈寮婚悢纰辨晣鐟滃秹鎮橀懠顒傜<閺夊牄鍔庣粻鐐烘煛鐏炶姤鍠橀柡浣瑰姍瀹曠喖顢橀悩铏钒闂備浇宕垫慨鎶芥⒔瀹ュ鍨傞柦妯猴級閿濆绀嬫い鏍ㄧ☉濞堟粓姊虹涵鍛【妞ゎ偅娲熼崺鈧い鎺嗗亾闁挎洩濡囧Σ鎰板籍閸繄顓洪梺缁樺姇瀵剙螖閸涱喚鍘搁梺鍓插亽閸嬪嫰鎮橀敃鍌涚厱閻庯綆鍋嗘晶顒傜磼閸屾稑绗ч柟鐟板閹煎湱鎲撮崟闈涙櫏闂傚倷绀侀幖顐も偓姘卞厴瀹曞綊鏌嗗鍛紱閻庡箍鍎遍ˇ浼村磿瀹ュ鐓曢柡鍥ュ妼婢ь垰霉閻樿秮顏堟箒闂佹寧绻傚Λ妤呭煝閺囥垺鐓冪憸婊堝礈濮樿泛钃熼柕濞у嫷鍋ㄩ梺缁樺姇椤曨參鍩㈤弴銏″€甸柨婵嗗€瑰▍鍥ㄣ亜韫囨稐鎲鹃柡灞炬礋瀹曢亶顢橀悢濂変紦

    重磅专题
    往期文章
    最新文章